package org.grade.handler;

import cn.hutool.json.JSONUtil;
import org.grade.common.Result;
import org.grade.utils.SecurityUtil;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 在用户尝试访问他们没有权限的资源时，返回一个包含错误信息的 JSON 响应
 * AccessDeniedHandler 是 Spring Security 框架中的一个接口，用于处理权限拒绝的情况。当一个用户尝试访问他们没有权限的资源时，会抛出 AccessDeniedException 异常。
 * 这个类需要实现 handle 方法来定义如何处理这种异常。
 */
@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {

    /**
     * a. 在这个方法中，首先创建一个 Result 对象，表示一个HTTP响应结果。这里设置 HTTP 状态码为 FORBIDDEN（403），表示用户没有权限执行某个操作。
     * b. 使用 JSONUtil.toJsonStr 方法将 Result 对象转换为 JSON 字符串。
     * c. 使用 SecurityUtil.renderString 方法将 JSON 字符串渲染到 HTTP 响应中。
     */
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        Result result = new Result(HttpStatus.FORBIDDEN.value(), "您的权限不足");
        String json = JSONUtil.toJsonStr(result);
        // 处理异常
        SecurityUtil.renderString(response, json);
    }
}
